/**
 * @Description:常用工具类
 * @author qpw
 * @Date 2024/07/20/18:22
 * @LastEditors: qpw
 * @LastEditTime: 2024/07/20/18:22
 **/


//

/**
 *处理视频返回时长
 * @param file  类似与element上传组件传给我们的file
 * @returns 返回时长
 */
export function getMp4Time(file) {
  return new Promise((resolve, reject) => {
    //把element上传组件传给我们的file转成url
    let url = URL.createObjectURL(file)
    //获取对象
    let audioElement = new Audio(url)
    //监听事件
    audioElement.addEventListener('loadedmetadata', () => {
      const time = Math.round(audioElement.duration * 100) / 100
      resolve(time)
    })
    audioElement.addEventListener('error', () => {
      resolve(0)
    })
  })
};

/**
 *返回视频第一帧
 * @param file  类似与element上传组件传给我们的file
 * @returns 返回第一帧视频的Base64图像数据
 */
export function getFirstFrame(file) {
  return new Promise((resolve, reject) => {
    // 将传入的文件转换成URL
    let url = URL.createObjectURL(file);

    // 创建一个video元素
    let videoElement = document.createElement('video');
    // 监听video元素的loadedmetadata事件
    videoElement.addEventListener('loadedmetadata', () => {
      // 在元数据加载完成后，将视频的currentTime设置为0，以便获取第一帧
      videoElement.currentTime = 0;
    });

    // 监听video元素的seeked事件，在视频的第一帧可用时触发
    videoElement.addEventListener('seeked', () => {
      // 创建一个canvas元素
      let canvas = document.createElement("canvas");
      let width = videoElement.videoWidth;
      let height = videoElement.videoHeight;
      canvas.width = width;
      canvas.height = height;

      // 在canvas上绘制视频的第一帧
      let ctx = canvas.getContext("2d");
      ctx.drawImage(videoElement, 0, 0, width, height);

      // 将绘制的图像数据转换为base64格式
      let dataURL = canvas.toDataURL('image/jpeg');

      // 释放资源
      URL.revokeObjectURL(url);

      // 清除临时canvas
      canvas = null;

      // 返回第一帧视频的Base64图像数据
      resolve(dataURL);
    });

    // 监听video元素的error事件
    videoElement.addEventListener('error', (err) => {
      console.log("无法加载视频:",err)
      reject(new Error('无法加载视频'));
    });

    // 设置video元素的src为传入的URL
    videoElement.src = url;
  });
}


/**
 * base64 转换为 file
 * 先将base64转换成blob，再将blob转换成file文件，此方法不存在浏览器不兼容问题
 * @param base64Url
 * @param filename
 * @returns
 */
export const base64UrlToFile = (base64Url, filename) => {
  // 获取到base64编码
  const arr = base64Url.split(',');
  const mime = arr[0].match(/:(.*?);/)[1];
  // 将base64编码转为字符串
  const baseStr = atob(arr[1]);
  let n = baseStr.length;
  // 创建初始化为0的，包含length个元素的无符号整型数组
  const u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = baseStr.charCodeAt(n);
  }
  return new File([u8arr],  { type: mime });
};


